using Sinacor.UI.Bovespa.Contabil.Communication;
using Sinacor.Infra.UI.Common;
using System.Collections.Generic;
using Sinacor.UI.Bovespa.Contabil.Communication.Bovespa.Contabil.TipoDespesa;
using Sinacor.Infra.UI.Security.Services;
using System;

namespace Sinacor.UI.Bovespa.Contabil.Communication
{
    public class TipoDespesa : BaseCommunication
    {
        public TipoDespesa(SessionInformation session) : base(session) { }

        public void AlterarTipoDespesa(Model.TipoDespesa model)
        {
            ITipoDespesa servico = null;

            try
            {
                using (ServiceInstance<ITipoDespesa> service = new ServiceInstance<ITipoDespesa>())
                {
                    servico = service.TryGetInstance(this.Session);
                    Translator.ModelToDataContract.TipoDespesa _toDataContract = new Sinacor.UI.Bovespa.Contabil.Communication.Translator.ModelToDataContract.TipoDespesa();
                    servico.AlterarTipoDespesa(_toDataContract.ToTipoDespesaRequest(model));
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
            }
        }

        public void AlterarTiposDespesas(ModelCollection<Model.TipoDespesa> modelList)
        {
            ITipoDespesa servico = null;

            try
            {
                using (ServiceInstance<ITipoDespesa> service = new ServiceInstance<ITipoDespesa>())
                {
                    servico = service.TryGetInstance(this.Session);
                    Translator.ModelToDataContract.TipoDespesa _toDataContract = new Sinacor.UI.Bovespa.Contabil.Communication.Translator.ModelToDataContract.TipoDespesa();
                    servico.AlterarTiposDespesas(_toDataContract.ToTipoDespesaRequest(modelList));
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
            }
        }

        public ModelCollection<Model.TipoDespesa> ConsultarTiposDespesas(Model.Parameter.FiltroTipoDespesa parameter)
        {
            ITipoDespesa servico = null;

            try
            {
                using (ServiceInstance<ITipoDespesa> service = new ServiceInstance<ITipoDespesa>())
                {
                    servico = service.TryGetInstance(this.Session);
                    Translator.ModelToDataContract.TipoDespesa _toDataContract = new Sinacor.UI.Bovespa.Contabil.Communication.Translator.ModelToDataContract.TipoDespesa();
                    Translator.DataContractToModel.TipoDespesa _toModel = new Sinacor.UI.Bovespa.Contabil.Communication.Translator.DataContractToModel.TipoDespesa();
                    return _toModel.ToTipoDespesa(servico.ConsultarTiposDespesas(_toDataContract.ToFiltroTipoDespesaRequest(parameter)));
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
                return null;
            }
        }

        public ModelCollection<Model.TipoDespesa> ConsultarTiposDespesasPeriodo(Model.Parameter.FiltroTipoDespesaPeriodo request)
        {
            ITipoDespesa servico = null;

            try
            {
                using (ServiceInstance<ITipoDespesa> service = new ServiceInstance<ITipoDespesa>())
                {
                    servico = service.TryGetInstance(this.Session);
                    Translator.ModelToDataContract.TipoDespesa _toDataContract = new Sinacor.UI.Bovespa.Contabil.Communication.Translator.ModelToDataContract.TipoDespesa();
                    Translator.DataContractToModel.TipoDespesa _toModel = new Sinacor.UI.Bovespa.Contabil.Communication.Translator.DataContractToModel.TipoDespesa();
                    return _toModel.ToTipoDespesa(servico.ConsultarTiposDespesasPeriodo(_toDataContract.ToFiltroTipoDespesaPeriodoRequest(request)));
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
                return null;
            }
        }

        public void ExcluirTipoDespesa(Model.Parameter.FiltroTipoDespesaChave parameter)
        {
            ITipoDespesa servico = null;

            try
            {
                using (ServiceInstance<ITipoDespesa> service = new ServiceInstance<ITipoDespesa>())
                {
                    servico = service.TryGetInstance(this.Session);
                    Translator.ModelToDataContract.TipoDespesa _toDataContract = new Sinacor.UI.Bovespa.Contabil.Communication.Translator.ModelToDataContract.TipoDespesa();
                    servico.ExcluirTipoDespesa(_toDataContract.ToFiltroTipoDespesaChaveRequest(parameter));
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
            }
        }

        public void ExcluirTiposDespesas(ModelCollection<Model.Parameter.FiltroTipoDespesaChave> parameterList)
        {
            ITipoDespesa servico = null;

            try
            {
                using (ServiceInstance<ITipoDespesa> service = new ServiceInstance<ITipoDespesa>())
                {
                    servico = service.TryGetInstance(this.Session);
                    Translator.ModelToDataContract.TipoDespesa _toDataContract = new Sinacor.UI.Bovespa.Contabil.Communication.Translator.ModelToDataContract.TipoDespesa();
                    servico.ExcluirTiposDespesas(_toDataContract.ToFiltroTipoDespesaChaveRequest(parameterList));
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
            }
        }

        public void ExecutarTransacoesTipoDespesa(ModelCollection<Model.TipoDespesa> inclusaoList, ModelCollection<Model.Parameter.FiltroTipoDespesaChave> exclusaoList, ModelCollection<Model.TipoDespesa> alteracaoList)
        {
            ITipoDespesa servico = null;

            try
            {
                using (ServiceInstance<ITipoDespesa> service = new ServiceInstance<ITipoDespesa>())
                {
                    servico = service.TryGetInstance(this.Session);
                    Translator.ModelToDataContract.TipoDespesa _toDataContract = new Sinacor.UI.Bovespa.Contabil.Communication.Translator.ModelToDataContract.TipoDespesa();
                    servico.ExecutarTransacoesTipoDespesa(_toDataContract.ToFiltroTipoDespesaChaveRequest(exclusaoList), _toDataContract.ToTipoDespesaRequest(inclusaoList), _toDataContract.ToTipoDespesaRequest(alteracaoList));
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
            }
        }


        public void IncluirTipoDespesa(Model.TipoDespesa model)
        {
            ITipoDespesa servico = null;

            try
            {
                using (ServiceInstance<ITipoDespesa> service = new ServiceInstance<ITipoDespesa>())
                {
                    servico = service.TryGetInstance(this.Session);
                    Translator.ModelToDataContract.TipoDespesa _toDataContract = new Sinacor.UI.Bovespa.Contabil.Communication.Translator.ModelToDataContract.TipoDespesa();
                    servico.IncluirTipoDespesa(_toDataContract.ToTipoDespesaRequest(model));
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
            }

        }

        public void IncluirTiposDespesas(ModelCollection<Model.TipoDespesa> modelList)
        {
            ITipoDespesa servico = null;

            try
            {
                using (ServiceInstance<ITipoDespesa> service = new ServiceInstance<ITipoDespesa>())
                {
                    servico = service.TryGetInstance(this.Session);
                    Translator.ModelToDataContract.TipoDespesa _toDataContract = new Sinacor.UI.Bovespa.Contabil.Communication.Translator.ModelToDataContract.TipoDespesa();
                    servico.IncluirTiposDespesas(_toDataContract.ToTipoDespesaRequest(modelList));
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
            }
        }


        public Model.TipoDespesa ObterTipoDespesa(Model.Parameter.FiltroTipoDespesaChave parameter)
        {

            ITipoDespesa servico = null;

            try
            {
                using (ServiceInstance<ITipoDespesa> service = new ServiceInstance<ITipoDespesa>())
                {
                    servico = service.TryGetInstance(this.Session);
                    Translator.ModelToDataContract.TipoDespesa _toDataContract = new Sinacor.UI.Bovespa.Contabil.Communication.Translator.ModelToDataContract.TipoDespesa();
                    Translator.DataContractToModel.TipoDespesa _toModel = new Sinacor.UI.Bovespa.Contabil.Communication.Translator.DataContractToModel.TipoDespesa();
                    return _toModel.ToTipoDespesa(servico.ObterTipoDespesa(_toDataContract.ToFiltroTipoDespesaChaveRequest(parameter)));
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
                return null;
            }
      
        }
    }
}